This is a starvation bug.
Main thread holds a lock and causes "Lucene Merge Thread #2" waiting for the lock.
But then Main thread itself goes to wait.
So both threads are in wait state as shown in the following stack trace.
More details about this bug are at LUCENE-2783 JIRA page.
"Lucene Merge Thread #2" daemon prio=6 tid=0x0000000007992000 nid=0x20c0 waiting for monitor entry [0x0000000007d9f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:4143)
- waiting to lock <0x00000000ec270458> (a java.lang.Object)
at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:5279)
at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:4675)
at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:235)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:291)
"main" prio=6 tid=0x000000000056c800 nid=0x2dc0 in Object.wait() [0x000000000252e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000ec299108> (a org.apache.lucene.index.ConcurrentMergeScheduler)
at java.lang.Object.wait(Object.java:485)
at org.apache.lucene.index.ConcurrentMergeScheduler.merge(ConcurrentMergeScheduler.java:200)
- locked <0x00000000ec299108> (a org.apache.lucene.index.ConcurrentMergeScheduler)
at org.apache.lucene.index.IndexWriter.maybeMerge(IndexWriter.java:3070)
at org.apache.lucene.index.IndexWriter.maybeMerge(IndexWriter.java:3065)
at org.apache.lucene.index.IndexWriter.maybeMerge(IndexWriter.java:3061)
at org.apache.lucene.index.IndexWriter.flush(IndexWriter.java:4256)
at org.apache.lucene.index.IndexWriter.prepareCommit(IndexWriter.java:4133)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:4206)
- locked <0x00000000ec270458> (a java.lang.Object)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:4179)
at org.apache.lucene.index.TestAtomicUpdate.runTest(TestAtomicUpdate.java:139)
at org.apache.lucene.index.TestAtomicUpdate.testAtomicUpdates(TestAtomicUpdate.java:187)
This bug is reproduced under lucene 4.3.0 and JDK 1.6.0_33.
Execute
the following scripts to run the test to reproduce the bug (assume the
location of the lucene test project is lucene_test_home).
Linux:
${lucene_test_home}/scripts/2783.sh
Windows:
%lucene_test_home%\scripts\2783.bat